package observer;

/**
 * 观察者模式（发布订阅模式）
 *  在对象之间定义一个一对多的依赖，当一个对象状态改变的时候，所有依赖的对象都自动收到通知
 *  被依赖对象：被观察者     发布者    生产者
 *  依赖的对象：观察者       订阅者    消费者
 *  1. 一个对象的改变需要改变其他对象
 *  2. 一个对象改变后仅需发送通知，不关注接受者是谁
 *  3. 链式触发机制，A影响B，B影响C
 *  4. 订阅者可以订阅和解绑
 *  5. 基于事件触发的场景
 * =>
 *  spring中有 事件消息Event、监听者Listener、发送者Publisher
 *  自定义消息   ApplicationListener<T>   ApplicationContext.publishEvent(T)
 */
public class ObserverTest {
    public static void main(String[] args) {
        //发布者
        PublisherImpl account = new PublisherImpl("王小美", 100);
        //订阅者
        ObserverImpl ob1 = new ObserverImpl("1号监控");
        ObserverImpl ob2 = new ObserverImpl("2号监控");
        ObserverImpl ob3 = new ObserverImpl("3号监控");
        //绑定
        account.addObserver(ob1);
        account.addObserver(ob2);
        account.addObserver(ob3);
        //操作
        System.out.println("第一次操作：");
        account.notify(50);
        System.out.println("第一次操作完成");
        //操作
        System.out.println("第二次操作：");
        account.notify(50);
        System.out.println("第二次操作完成");
    }
}
